home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 1
/
Gekikoh Dennoh Club Vol. 1 (Japan).7z
/
Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin
/
tools
/
ebsx130
/
eb.c
< prev
next >
Wrap
Text File
|
1997-05-06
|
34KB
|
1,475 lines
/* EB.X V1.40d
1996.5.2 鈴木 健児 */
/* V1.00a : 環境変数 EB_FILE をデフォルトの検索ファイル名にする
1995.9.02 電脳魔術団 */
#include "common.h"
#include <stdlib.h>
#include <iocslib.h>
#include <jctype.h>
/* #include <string.h> */
#include <method/Dialog_i.h>
#include <method/Event_i.h>
#include <method/Dos_i.h>
#include <method/Memory_i.h>
#include <method/Task_i.h>
#include <method/_methodSx.h>
#include <method/sxutil.h>
/* プロトタイプ宣言 */
/* kenji suzuki */
int CdFileOpen( char * , char * );
int set_gaiji( void );
int CdFileClose( void );
int Eb_Main( char * );
int conv_input( char * , char * , char * );
jischar *shift_jis( char * , jischar * , size_l );
int search_blockpos( void );
unsigned int search_index( unsigned int , jischar * );
int read_index( int , int * );
int search_komoku( jischar * , jischar * , char * , unsigned int * );
int skip_komoku( void );
int search_komoku2( jischar * , jischar * , char * , unsigned int * );
int printout( unsigned int , char * );
int printout2( int , unsigned int );
void InitTable( void );
int AddTable( char * , unsigned int );
/* menu.cから */
int read_catalog( char * );
int get_path( char * , int , char * );
int get_title( char * , char *);
int read_catalogEP( char * );
int get_pathEP( char * , int , char * );
int get_titleEP( char * , char *);
void convJis( jischar * );
int AddTable2( char * , char * );
/* グローバル変数 */
char out[ 0x800*10 ];
unsigned int gindexpage , gindexoff; /* kenji suzuki グラフィック用*/
unsigned int lindexpage , lindexoff; /* kenji suzuki 参照検索用*/
unsigned int mindexpage , mindexoff; /* kenji suzuki メニュー検索用*/
int alpha;
int linkflg; /* kenji suzuki 0 = 参照検索していても無視する */
/* menu.cから */
int codetbl1[ 190 ];
int codetbl2[ 190 ];
int codetblebg[ 258 ];
int menuposmax; /* static ではない */
/* graphic.cから */
int glinkno;
/* QueryError用 */
#define rectQE Rect(10, 30, 240, 160)
int EventForQE( order_t );
extern window_t mainWin;
/* 変数、バッファ */
char *filepath = NULL;
/* char fn[ FILENAME_MAX ] = { "f:\\fsschro\\start" };
*/
/* static char fn[ FILENAME_MAX ] = { 0 , }; */
static unsigned char buffer[ 0x800+8 ];
static int b_offset;
static int lastpage;
char a_key=0;
static char n_key=0;
char t_key=0;
char r_key=0;
static char g_key=0; /* kenji suzuki 外字用 */
static char i_key=0; /* kenji suzuki グラフィック用 */
static char l_key=0; /* kenji suzuki 参照検索用 */
char e_key=0; /* kenji suzuki EBG(英語版)用 */
char c_key=0; /* kenji suzuki コマンドモード用 */
static char d1_key = 0; /* debug */
static char d2_key = 0; /* debug */
char d3_key = 0; /* debug */
char w_key = 0; /* epwingタイプのCD-ROMなら1 */
int kouhocount;
static int blocksuu;
unsigned int pagenumber;
static unsigned int k_rootpagenumber=0; /* かなルートインデックス */
static unsigned int k_r_rootpagenumber=0; /* かな逆引きルートインデックス */
static unsigned int a_rootpagenumber=0; /* 英語ルートインデックス */
static unsigned int a_r_rootpagenumber=0; /* 英語逆引きルートインデックス */
static unsigned int f1pagenumber=0; /* 全角外字 */
static unsigned int f2pagenumber=0; /* 半角外字 */
unsigned int mpagenumber = 0; /* メニューインデックス */
int CdFileOpen( char *filename , char *oldfilename )
{
int flg = 0;
int retcode;
retcode = 0;
filepath = filename;
if( cdfile > 0 )
{
flg = 1;
CdFileClose( );
};
cdfile = TSOpen( filepath , 0 );
if( cdfile < 0 )
{
/* ULError_str( "eb_sx.x:!! ファイルがオープンできません path=\n" ,filepath ); */
/* 元もと開いていたファイルを再度開く */
if( flg == 1 )
{
cdfile = TSOpen( oldfilename , 0 );
};
retcode = -1;
};
search_blockpos();
set_gaiji( );
return( retcode );
};
int set_gaiji( void )
{
int code;
int i;
if( e_key == 0 )
{
code = 0xeb9f;
/* 半角外字の登録 */
/* 追加(95.10.03 M.Kamada) */
codetbl2[ 0 ] = 0xffff;
if( f2pagenumber != 0 && w_key == 0 ) /* w_keyについては暫定措置 */
{
code = set_gaiji2( code , f2pagenumber-1 );
/* printf( "\ncode2 = %x\n" , code ); */
};
/* 全角外字の登録 */
/* 追加(95.10.03 M.Kamada) */
codetbl1[ 0 ] = 0xffff;
if( f1pagenumber != 0 && w_key == 0 ) /* w_keyについては暫定措置 */
{
code = set_gaiji1( code , f1pagenumber-1 );
/* printf( "\ncode1 = %x\n" , code ); */
};
} else {
code = 0xeb9f;
/* 半角外字の登録 */
/* 追加(95.10.03 M.Kamada) */
codetbl2[ 0 ] = 0xffff;
if( f2pagenumber != 0 )
{
code = set_gaiji_ebg( code , f2pagenumber-1 );
/* printf( "\ncode2 = %x\n" , code ); */
} else {
for( i=0; i<257; i++ )
{
codetblebg[ i ] = 0xffff;
};
};
};
return( 0 );
}
int CdFileClose( void )
{
TSClose( cdfile );
bunkenFile = NULL;
if( e_key == 0 )
{
if( w_key == 0 )
{
reset_gaiji();
};
} else {
reset_gaiji_ebg();
};
k_rootpagenumber = 0;
k_r_rootpagenumber = 0;
a_rootpagenumber = 0;
a_r_rootpagenumber = 0;
f2pagenumber = 0;
f1pagenumber = 0;
mpagenumber = 0;
kouhocount = 0;
return( 0 );
}
int Eb_Main( char *searchword )
{
jischar sei[ 258 ];
jischar daku[ 258 ];
int indextype;
int stat;
int count;
unsigned int filepos;
if( searchMode == 3 )
{
a_key = 1;
} else if( searchMode == 2 )
{
r_key = 1;
a_key = 0;
} else {
r_key = 0;
a_key = 0;
};
stat = conv_input( searchword , sei , daku );
if( stat < 0 )
{
return( 0 );
};
stat = 1;
while( stat != 0 )
{
pagenumber = search_index( pagenumber , sei );
if( pagenumber == 0 )
{
return( 0 ); /* 入力文字が異常? */
};
stat = read_index( 1 , &indextype ); /* stat != 0 ならルートインデックスがネスティングしている */
};
if( d1_key == 1 )
{
return( 0 );
};
t_key = 1;
InitTable();
kouhocount = 0;
stat = 0;
while( stat >= 0 )
{
/* init_menutbl( );
linkflg = 1;
gindexpage = 0;
gindexoff = 0;
lindexpage = 0;
lindexoff = 0;
glinkno = 0;
*/
if( indextype == 1 )
{
stat = search_komoku( sei , daku , out , &filepos );
} else {
stat = search_komoku2( sei , daku , out , &filepos);
};
if( stat == 0 )
{
kouhocount++;
/* printout( filepos , out );
if( i_key == 1 && (( gindexpage != 0 ) || ( gindexoff != 0 )) )
{
gindexpage = conv_hex( gindexpage );
gindexoff = conv_hex( gindexoff );
search_graphicindex( (gindexpage-1)*0x800+gindexoff );
};
if( l_key == 1 && menuposmax > 0 )
{
linkflg = 0;
count = 1;
while( count <= menuposmax )
{
printout( menupostbl[ count-1 ] , out );
*/ /* 参照した項目に画像があった場合 */
/* if( i_key == 1 && (( gindexpage != 0 ) || ( gindexoff != 0 )) )
{
gindexpage = conv_hex( gindexpage );
gindexoff = conv_hex( gindexoff );
search_graphicindex( (gindexpage-1)*0x800+gindexoff );
};
count++;
};
};
*/ };
};
/* if (n_key) {
if (kouhocount>0)
printf("%d 個の候補があります\n",kouhocount);
else puts("候補がありません");
} else {
if( kouhocount == 0 )
{
puts( "一致する項目はありません\n" );
};
};
*/
return( 0 );
}
/* 入力文字を変換する */
int conv_input( char *searchword , char *sei , char *daku )
{
char *p;
/* 清音JISに変換 */
if( e_key == 0 )
{
p = (char *)seion(searchword,sei,sizeof(sei));
if( p==NULL )
{
QueryError(1, "この文字列は検索できません\0\0" , (proc_t) EventForQE, &mainWin, &rectQE);
return( -1 );
};
/* ただ単にJISに変換 */
shift_jis( searchword , daku , sizeof(daku));
} else {
strcpy( daku , searchword );
strupr( daku );
strcpy( sei , daku );
}
if( alpha == 1 )
{
k_r_rootpagenumber = a_r_rootpagenumber;
k_rootpagenumber = a_rootpagenumber;
};
if( r_key )
{
if( e_key == 1 )
{
strrev( sei );
strrev( daku );
} else {
jismirror( sei );
jismirror( daku );
};
pagenumber = k_r_rootpagenumber;
} else {
pagenumber = k_rootpagenumber;
};
/* printf( "input str = %s\n" , sei ); */
if( pagenumber == 0 )
{
QueryError(1, "この文献には項目が登録されていません\0\0" , (proc_t) EventForQE, &mainWin, &rectQE);
return( -1 );
};
return( 0 );
}
/* SHIFT-JIS を JIS にする */
jischar* shift_jis( char *str, jischar *outp, size_l length )
{
unsigned char c,fc;
int ch;
char *s=str;
jischar *p=outp;
fc=0;
while (c=*s++) {
if ((ch=AKCONV(0,c))<0) {
if (iskanji(c)) {
ch=c<<8;
c=*s++;
if (iskanji2(c)) {
ch+=c;
}
} else return NULL;
}
ch=SFTJIS(ch);
if ((ch&0xffe0)==0x2360) ch&=0x235f; /* from seion.c 英小文字を大文字化 */
/* *p++=JISSFT(ch); */
*p++=ch;
}
*p++=0;
/* p=outp;
while (ch=*p++) {
ch=JISSFT(ch);
putchar(ch>>8); putchar(ch);
putchar('\n');
} */
return outp;
}
int checkFile( char *arg )
{
int l;
int i;
int delimit;
char *work;
int retcode;
w_key = 0;
work = arg;
l = strlen( work );
if( l == 0 )
{
return( 0 );
};
retcode = 0;
i = 0;
delimit = 0;
while( i < l )
{
if( work[ i ] == '/' || work[ i ] == '\\' || work[ i ] == ':' )
{
delimit = i;
};
i++;
};
if( stricmp( work+delimit+1 , "catalog" ) == 0 )
{
retcode = 1;
} else if( stricmp( work+delimit+1 , "start" ) == 0 )
{
retcode = 2;
} else if( stricmp( work+delimit+1 , "catalogs" ) == 0 )
{
w_key = 1;
retcode = 3;
} else if( stricmp( work+delimit+1 , "honmon" ) == 0 )
{
w_key = 1;
retcode = 4;
};
return( retcode );
}
/* d100 がグラフィックデータ */
/* 0f00 がそのインデックス */
int search_blockpos( void )
{
unsigned short saizu;
unsigned short data;
int i;
DOSREAD( cdfile , &saizu , sizeof( unsigned short ) );
DOSSEEK( cdfile , 16 , SEEK_SET );
i = 0;
while( i < saizu )
{
DOSREAD( cdfile , &data , sizeof( unsigned short ) );
/* printf( "data =%x\n" , data ); */
if(( data & 0xff00 ) == 0x9000 )
{
DOSREAD( cdfile , &k_rootpagenumber , sizeof( unsigned int ) );
DOSSEEK( cdfile , 10 , SEEK_CUR );
if( a_rootpagenumber == 0 )
{
a_rootpagenumber = k_rootpagenumber;
};
}
else if(( data & 0xff00 ) == 0x9100 )
{
DOSREAD( cdfile , &a_rootpagenumber , sizeof( unsigned int ) );
DOSSEEK( cdfile , 10 , SEEK_CUR );
if( k_rootpagenumber == 0 )
{
k_rootpagenumber = a_rootpagenumber;
};
}
else if(( data & 0xff00 ) == 0x7000 )
{
DOSREAD( cdfile , &k_r_rootpagenumber , sizeof( unsigned int ) );
DOSSEEK( cdfile , 10 , SEEK_CUR );
if( a_r_rootpagenumber == 0 )
{
a_r_rootpagenumber = k_r_rootpagenumber;
};
}
else if(( data & 0xff00 ) == 0x7100 )
{
DOSREAD( cdfile , &a_r_rootpagenumber , sizeof( unsigned int ) );
DOSSEEK( cdfile , 10 , SEEK_CUR );
if( k_r_rootpagenumber == 0 )
{
k_r_rootpagenumber = a_r_rootpagenumber;
};
}
else if(( data & 0xff00 ) == 0xf200 )
{
DOSREAD( cdfile , &f2pagenumber , sizeof( unsigned int ) );
DOSSEEK( cdfile , 10 , SEEK_CUR );
}
else if(( data & 0xff00 ) == 0xf100 )
{
DOSREAD( cdfile , &f1pagenumber , sizeof( unsigned int ) );
DOSSEEK( cdfile , 10 , SEEK_CUR );
}
else if(( data & 0xff00 ) == 0x0100 )
{
DOSREAD( cdfile , &mpagenumber , sizeof( unsigned int ) );
DOSSEEK( cdfile , 10 , SEEK_CUR );
}
else
{
DOSSEEK( cdfile , 14 , SEEK_CUR );
};
i++;
};
return( 0 );
}
/* ルートインデックス内をサーチして、インデックスのページ番号を得る */
unsigned int search_index( unsigned int rootpagenum , jischar *jc )
{
int i;
unsigned int flg;
int stat;
unsigned char komoku[ 257 ];
unsigned short header;
unsigned short saizu;
unsigned short leng;
unsigned int indexpagenum;
DOSSEEK( cdfile , ( rootpagenum-1 )*0x800 , SEEK_SET );
DOSREAD( cdfile , &header , sizeof( unsigned short ) );
/* printf( "page = %d , head = %x\n" , rootpagenum , header ); */
if( (header & 0xf000) > 0x6000 )
{
puts( "Error このページはルートインデックスではありません\n" );
return( 0 );
};
leng = ( header & 0x00ff );
DOSREAD( cdfile , &saizu , sizeof( unsigned short ) );
/* printf( "head:%x , saizu:%d\n" , header , saizu ); */
i = 0;
flg = 0;
while( (i < saizu) && (flg == 0) )
{
DOSREAD( cdfile , komoku , leng );
komoku[ leng ] = 0;
DOSREAD( cdfile , &indexpagenum , sizeof( unsigned int ) );
/* printf( "no;%d -%32s %x-\n" , i , komoku , indexpagenum ); */
stat = strncmp2( jc , komoku , leng );
if( stat == 0 )
{
if( d1_key )
printf( "このページ pagenum = %d\n" , indexpagenum );
flg = indexpagenum;
} else {
/* 入力文字の方が小さい */
if( stat < 0 )
{
if( d1_key )
printf( "このページ pagenum = %d\n" , indexpagenum );
flg = indexpagenum;
};
};
i++;
};
if( flg == 0 )
{
puts( "Error インデックスが異常です\n" );
};
return( flg );
}
/* インデックスを読み込む */
int read_index( int flg , int *indextype )
{
unsigned short leng;
/* printf( "page = %x\n" , pagenumber ); */
DOSSEEK( cdfile , ( pagenumber-1 )*0x800 , SEEK_SET );
pagenumber++;
DOSREAD( cdfile , buffer , 0x800 );
buffer[ 0x800 ] = 0; /* 終端記号 */
buffer[ 0x801 ] = 0; /* 終端記号 */
buffer[ 0x802 ] = 0; /* 終端記号 */
buffer[ 0x803 ] = 0; /* 終端記号 */
b_offset = 0;
/* 読み込んだページが、またルートインデックスだった(ネスティング) */
/* printf( "head_b = %x\n" , buffer[ b_offset ]); */
if( buffer[ b_offset ] < 0x70 )
{
pagenumber--;
return( -1 );
};
if( d1_key )
{
pagenumber--;
DOSSEEK( cdfile , ( pagenumber-1 )*0x800 , SEEK_SET );
return( 0 );
};
/* インデックスのタイプの判定 */
if( (buffer[ b_offset ] & 0x10) == 0x10 )
{
/* 日本語 search_komoku 0xd000 0x9000 0xb000 */
*indextype = 1;
} else {
/* 英語他 search_komoku2 0xc000 0x8000 0xa000 */
*indextype = 0;
};
/* これがインデックスの最後のページか? 0xb000 0xa000 */
if( (buffer[ b_offset ] & 0xe0) == 0xa0 )
{
lastpage = 1;
} else {
lastpage = 0;
};
b_offset += 4;
/* 前のページから続いている部分をとばす 日本語の場合のみ*/
if( (flg == 1) && (*indextype == 1) )
{
leng = (buffer[ b_offset ] << 8) + buffer[ b_offset+1 ];
while(( leng & 0xff00 ) == 0xc000 )
{
b_offset += (leng & 0x00ff)+14;
leng = (buffer[ b_offset ] << 8) + buffer[ b_offset+1 ];
};
};
return( 0 );
}
/* 日本語版のインデックス内をサーチして、本文のページ番号を得る */
/* 戻り値 = 0 入力文字列に該当する項目があった */
/* = -1 入力文字列より大きい項目に当たった = ループ終了 */
/* = 1 入力文字列より小さい項目に当たった = ループ続ける */
int search_komoku( jischar *seion , jischar *nyuryoku , char *out , unsigned int *filepos )
{
unsigned short leng;
unsigned short sleng;
int stat;
unsigned int pagenum;
unsigned short offset;
int indextype;
/* 96.4.13 */
int retcode;
/* 96.5.13 */
int statB;
leng = (buffer[ b_offset ] << 8) + buffer[ b_offset+1 ];
/* 次のページへ続く場合の処理 */
if( leng == 0x0000 ) /* 「leng & 0xff00」を「leng」に変更 */
{
if( lastpage == 0 )
{
read_index( 0 , &indextype ); /* indextype はダミー */
leng = (buffer[ b_offset ] << 8) + buffer[ b_offset+1 ];
} else {
return( -1 );
};
};
b_offset += 2;
/* 95.11.16 追加 */
if( leng < 0x8000 )
{
blocksuu = 1; /* 本当はブロックはないけど、1にする */
/* 96.11.7 1ブロックの場合でも、清音、入力文字と2度比較する */
/* 清音と比較する処理 */
sleng = strlen( seion );
/* printf( ":" );
printjis( &buffer[ b_offset ] );
printf( ":%x , %4x\n" , leng , sleng );
*/ /* 入力文字より文字数が少ない場合は次の項目へスキップ
入力=あいうえ、buf=あい がヒットするのを防ぐため */
if(( leng & 0x00ff ) >= sleng )
{
stat = strncmp2( seion , &buffer[ b_offset ] , sleng ); /* 入力文字数文だけ比較 */
if( stat < 0 )
{
return( -1 );
};
/* 完全一致検索の場合 文字数がちがう場合スキップ */
if( (a_key == 1) && ((leng & 0x00ff) != sleng) )
{
b_offset -= 2;
stat = skip_komoku( );
return( stat );
};
} else {
if( seion[ 0 ] < ((buffer[ b_offset ] << 8) + buffer[ b_offset+1 ]) )
{
return( -1 );
} else {
b_offset -= 2;
stat = skip_komoku( );
return( stat );
};
};
} else if( leng < 0xc000 )
{
blocksuu = (buffer[ b_offset ] << 8) + buffer[ b_offset+1 ]; /* 0 なんてケースは無いはず */
b_offset += 2;
/* 清音と比較する処理 */
sleng = strlen( seion );
/* printf( ":" );
printjis( &buffer[ b_offset ] );
printf( ":%x , %4x\n" , leng , sleng );
*/ /* 入力文字より文字数が少ない場合は次の項目へスキップ
入力=あいうえ、buf=あい がヒットするのを防ぐため */
if(( leng & 0x00ff ) >= sleng )
{
stat = strncmp2( seion , &buffer[ b_offset ] , sleng ); /* 入力文字数文だけ比較 */
if( stat < 0 )
{
return( -1 );
};
/* 完全一致検索の場合 文字数がちがう場合スキップ */
if( (a_key == 1) && ((leng & 0x00ff) != sleng) )
{
b_offset += ( leng & 0x00ff );
stat = skip_komoku( );
return( stat );
};
} else {
if( seion[ 0 ] < ((buffer[ b_offset ] << 8) + buffer[ b_offset+1 ]) )
{
return( -1 );
} else {
b_offset += ( leng & 0x00ff );
stat = skip_komoku( );
return( stat );
};
};
b_offset += ( leng & 0x00ff );
/* 次のページへ続く場合の処理 */
leng = (buffer[ b_offset ] << 8) + buffer[ b_offset+1 ];
if( leng == 0x0000 )
{
if( lastpage == 0 )
{
read_index( 0 , &indextype ); /* indextype はダミー */
leng = (buffer[ b_offset ] << 8) + buffer[ b_offset+1 ];
} else {
return( -1 );
};
};
b_offset+=2;
};
sleng = strlen( nyuryoku );
/* 入力文字より文字数が少ない場合は次の項目へスキップ
入力=あいうえ、buf=あい がヒットするのを防ぐため */
if(( leng & 0x00ff ) >= sleng )
{
/* 入力文字と比較する処理 */
stat = strncmp2( nyuryoku , &buffer[ b_offset ] , sleng );
/* printjis( &buffer[ b_offset ] );
printf( " leng = %4x :%d %d\n" , leng , stat ,b_offset );
*/
} else {
stat = 1;
};
b_offset += ( leng & 0x00ff );
pagenum = (buffer[ b_offset ] << 24) + (buffer[ b_offset+1 ] << 16) + (buffer[ b_offset+2 ] << 8) + buffer[ b_offset+3 ];
offset = (buffer[ b_offset+4 ] << 8) + buffer[ b_offset+5 ];
b_offset += 12;
blocksuu--;
/* DMError( 1 , "つうか" ); */
/* 当たり 表示 */
/* printf( "page = %x offset = %x\n" , pagenum , offset ); */
retcode = 1;
if( stat == 0 )
{
/* 完全一致検索の場合 文字数がちがえばスキップ */
if( a_key == 1 )
{
/* printf( " 直前 %d %d " , leng , sleng ); */
if( (leng & 0x00ff) == sleng )
{
*filepos = (pagenum-1) * 0x800 + offset;
printout( *filepos , out );
statB = AddTable( out , *filepos );
if( statB == -1 )
{
/* 項目数が多すぎる or メモリが足りない */
return( -1 );
};
retcode = 0;
};
} else {
*filepos = (pagenum-1) * 0x800 + offset;
printout( *filepos , out );
statB = AddTable( out , *filepos );
if( statB == -1 )
{
/* 項目数が多すぎる or メモリが足りない */
return( -1 );
};
retcode = 0;
};
} else if( stat < 0 )
{
/* ループを続けるため 1 にする */
if( leng < 0x8000 )
{
retcode = 1;
} else if( leng >= 0xc000 )
{
retcode = 1;
} else {
retcode = -1;
};
};
/* printf( "\n" ); */
return( retcode );
}
/* 次の項目の頭までスキップする */
int skip_komoku( void )
{
unsigned short leng;
int indextype;
while( blocksuu > 0 )
{
/* 次のページへ続く場合の処理 */
leng = (buffer[ b_offset ] << 8) + buffer[ b_offset+1 ];
if( leng == 0x0000 )
{
if( lastpage == 0 )
{
read_index( 0 , &indextype ); /* indextype はダミー */
leng = (buffer[ b_offset ] << 8) + buffer[ b_offset+1 ];
} else {
return( -1 ); /* ループ終わり */
};
};
b_offset += 2 + ( leng & 0x00ff ) + 12; /* leng + 文字列 + ポインタ */
blocksuu--;
};
return( 1 ); /* ループ続ける */
}
/* 英語他のインデックス */
/* 戻り値 = 0 入力文字列に該当する項目があった */
/* = -1 入力文字列より大きい項目に当たった = ループ終了 */
/* = 1 入力文字列より小さい項目に当たった = ループ続ける */
int search_komoku2( jischar *seion , jischar *nyuryoku , char *out , unsigned int *filepos )
{
unsigned char leng;
int indextype;
int i;
unsigned char sleng;
int stat;
unsigned int pagenum;
unsigned short offset;
/* 96.4.13 */
int retcode;
int skip;
char *ptr;
int statB;
retcode = 1;
leng = buffer[ b_offset ];
/* ページをまたがる場合の処理 */
if( leng == 0x00 )
{
if( lastpage == 0 )
{
read_index( 0 , &indextype ); /* indextype はダミー */
leng = buffer[ b_offset ];
} else {
return( -1 );
};
};
b_offset++;
/* 入力文字と比較する処理 */
sleng = strlen( nyuryoku );
/* bufの項目が「file 」(スペースで終わる)の場合、「file」として比較する
完全一致検索で、入力「file」、buf「file 」をヒットさせるため
ただし、入力文字列の最後がスペースの場合「file 」は、除く */
/* 入力 buf
「file」 , 「file」 そのまま比較
「file」 , 「file 」 この場合のみ、buf「file」として比較する
「file 」 , 「file」 そのまま比較
「file 」 , 「file 」 そのまま比較 */
if( buffer[ b_offset + leng-1 ] == 0x20 ) /* bufの最後は0x20か? */
{
ptr = nyuryoku;
if( ptr[ sleng-1 ] == 0x20 ) /* 入力の最後も0x20か? */
{
skip = 0;
} else {
leng--;
skip = 1;
};
} else {
skip = 0;
};
/* printf( ":%s:%4x , :" , &buffer[ b_offset ] , leng );
printjis( nyuryoku );
printf( ":%s:%4x ,%d\n" , nyuryoku , sleng , skip );
*/ /* 入力文字より文字数が少ない場合は次の項目へスキップ
入力=あいうえ、buf=あい がヒットするのを防ぐため */
if( leng >= sleng )
{
stat = strncmp2( nyuryoku , &buffer[ b_offset ] , sleng ); /* 入力文字数文だけ比較 */
if( stat < 0 )
{
return( -1 );
};
/* 完全一致検索の場合 文字数がちがう場合スキップ */
if( (a_key == 1) && (leng != sleng) )
{
stat = -1;
};
} else {
if( nyuryoku[ 0 ] < ((buffer[ b_offset ] << 8) + buffer[ b_offset+1 ]) )
{
return( -1 );
} else {
stat = -1;
};
};
b_offset = b_offset + leng + skip;
pagenum = (buffer[ b_offset ] << 24) + (buffer[ b_offset+1 ] << 16) + (buffer[ b_offset+2 ] << 8) + buffer[ b_offset+3 ];
offset = (buffer[ b_offset+4 ] << 8) + buffer[ b_offset+5 ];
b_offset += 12;
i++;
/* 当たり 表示 */
/* printf( "page = %x offset = %x\n" , pagen , offsetn ); */
if( stat == 0 )
{
/* 完全一致検索の場合 文字数がちがえばスキップ */
if( a_key == 1 )
{
if( leng == sleng )
{
*filepos = (pagenum-1) * 0x800 + offset;
printout( *filepos , out );
statB = AddTable( out , *filepos );
if( statB == -1 )
{
/* 項目数が多すぎる or メモリが足りない */
return( -1 );
};
retcode = 0;
};
} else {
*filepos = (pagenum-1) * 0x800 + offset;
printout( *filepos , out );
statB = AddTable( out , *filepos );
if( statB == -1 )
{
/* 項目数が多すぎる or メモリが足りない */
return( -1 );
};
retcode = 0;
};
};
/* leng を元に戻す */
/* if( skip == 1 )
{
leng++;
}; */
/* printf( "\n" ); */
return( retcode );
}
int printout( unsigned int filepos , char *out )
{
int steps;
int nextflg; /* この関数では関係ない */
if( n_key == 0 )
{
/* printf( "filepos = %x\n" , filepos ); */
DOSSEEK( cdfile , filepos , SEEK_SET );
if( d3_key == 0 )
{
steps = jis2shift( out , 0x800*4 , t_key , &nextflg );
/* DMError( 1,out ); */
/* puts( out );
} else {
printdump( );
*/ };
};
return( 0 );
};
int printout2( int line , unsigned int filepos )
{
static char fockname[] = "eb_hon.x";
/* 012345678901234567890123456 */
static char comline[180];
static char work[ 60 ];
char *workptr;
int stat;
/* コマンドラインの作成 */
strcpy( comline , " -t" );
workptr = work;
ULUsingX( workptr, (int)filepos , 8 );
while( *workptr == ' ' && *workptr != 0 ) /* 頭のスペースをとばす */
workptr++;
strcat( comline, workptr );
strcat( comline , " -f" );
strcat( comline , bunkenFile );
if( e_key == 1 )
{
strcat( comline , " -e" );
};
strcat( comline , " -g" );
workptr = work;
ULUsingX( workptr, limit , 8 );
while( *workptr == ' ' && *workptr != 0 ) /* 頭のスペースをとばす */
workptr++;
strcat( comline, workptr );
*comline = strlen( comline+1 );
stat = TSFockB( 0,fockname , comline , 0,fockname );
return( stat );
};
/* 本文表示タスクをすべて終了させる */
int TskAllClose( void )
{
tsevent eventRec;
int ret;
short tskid,maxtskid;
long stat;
eventRec.when = EMSysTime();
eventRec.what2 = ENDTSK;
tskid = 1;
while( tskid > 0 )
{
stat = TSFindTskn( "eb_hon.x" , (int)tskid );
tskid = stat & 0xffff;
if( tskid > 0 )
{
ret = TSSendMes( (int)tskid , &eventRec);
};
};
return( 0 );
}
void InitTable( void )
{
while (--tableMax >= 0) {
if( tablePostNo[tableMax] != NULL)
{
_ULFREE(tablePostNo[tableMax]);
tablePostNo[tableMax] = NULL;
tableFilePos[ tableMax ] = 0;
};
}
tableMax = 0;
}
int AddTable( char *cnt , unsigned int filepos )
{
int count = 0;
char *d, *s;
if (tableMax >= MAX_TABLE_POST_NO )
return -1; /* MAX_TABLE_POST_NO 個以上なんてあったら そりゃ郵政省が悪い */
if ((d = tablePostNo[tableMax] = _ULMALLOC(strlen(cnt) + 10)) == NULL) {
QueryError(1,"メモリが足りません\0\0", (proc_t) EventForQE, &mainWin, &rectQE);
return -1;
}
/* 32以上だと、項目の0文字目を1バイト開けなければならない
* 表Methodの仕様 */
*d = 0;
d += (tableMax < 32 ? 0:1);
/* 項目をコピー */
strcpy( d,cnt);
tableFilePos[ tableMax ] = filepos;
tableMax++;
return 0;
}
/* EB/EBG/EBXA用 */
/* tablePostNo[] , tableMax の値が変わるので注意 */
/* CATALOGファイルを読み込む */
int read_catalog( char *path )
{
int catalog = 0;
int i;
unsigned char komokuz[ 34 ];
unsigned char komokuh[ 10 ];
unsigned short saizu;
unsigned short dummy;
if( oprateMode > 1 )
{
CdFileClose( );
};
InitTable();
catalog = TSOpen( path , 0 );
if( catalog < 0 )
{
return( -1 );
};
DOSREAD( catalog , &saizu , sizeof( unsigned short ) );
DOSSEEK( catalog , 14 , SEEK_CUR );
i = 0;
while( i < saizu )
{
DOSREAD( catalog , &dummy , sizeof( unsigned short ) );
DOSREAD( catalog , komokuz , 30 ); /* 全角(文献の名前) */
komokuz[ 30 ] = 0;
komokuz[ 31 ] = 0; /* printjis() では2バイト単位で処理するので 0 も2バイト分書き込まないといけない */
DOSREAD( catalog , komokuh, 8 ); /* 半角(ディレクトリ名) */
komokuh[ 8 ] = 0;
if( e_key == 0 )
{
convJis( (jischar *)komokuz ); /* SJISに変換する */
};
AddTable2( komokuz , komokuh ); /* 後ろの引数2つはダミー(0 , 0のこと) */
i++;
};
TSClose( catalog );
return( 0 );
}
/* CATALOGファイル中のパス名の部分を得る */
/*
in path CATALOGファイルのパス
num 番号
out path2 STARTファイルへのパス(最大8文字だけど、10文字分確保すること)
*/
int get_path( char *path , int num , char *path2 )
{
int catalog = 0;
catalog = TSOpen( path , 0 );
if( catalog < 0 )
{
return( -1 );
};
DOSSEEK( catalog , 16 , SEEK_CUR );
if( num > 1 )
{
DOSSEEK( catalog , 40*( num-1 ) , SEEK_CUR );
};
DOSSEEK( catalog , 32 , SEEK_CUR );
DOSREAD( catalog , path2 , 8 ); /* 半角(ディレクトリ名) */
path2[ 8 ] = 0;
TSClose( catalog );
return( 0 );
}
/* STARTファイルの文献名を得る */
/*
in path STARTファイルのパス
out title STARTファイルの文献名(最大8文字だけど、10文字分確保すること)
*/
int get_title( char *path , char *title )
{
int i;
unsigned short saizu;
int catalog = 0;
char cpath[ 258 ];
char work[ 258 ];
char path2[10];
char *pwork;
int retcode;
retcode = -1;
/* CATALOGファイルのパスを作る */
strncpy( cpath , path , 2 );
cpath[ 2 ] = '\0';
strcat( cpath , "\\catalog" );
/* パス名を取り出す */
pwork = ULPathOf( work , path );
*pwork = '\0';
catalog = TSOpen( cpath , 0 );
if( catalog < 0 )
{
/* ULError_str( "eb_sx.x:!! ファイルがオープンできません path=\n" ,cpath ); */
return( -1 ); /* CATALOGファイルが見つからなかった */
};
DOSREAD( catalog , &saizu , sizeof( unsigned short ) );
DOSSEEK( catalog , 14 , SEEK_CUR );
i = 0;
while( i < saizu )
{
DOSSEEK( catalog , 2 , SEEK_CUR );
DOSREAD( catalog , title , 30 );
title[ 30 ] = 0;
DOSREAD( catalog , path2 , 8 ); /* 半角(ディレクトリ名) */
path2[ 8 ] = 0;
if( stricmp( work+3 , path2 ) == 0 )
{
i = saizu; /* ループ終わり */
retcode = 0;
} else {
title[ 0 ] = '\0';
};
i++;
};
TSClose( catalog );
return( retcode );
}
/* EPWING用 */
/* tablePostNo[] , tableMax の値が変わるので注意 */
/* CATALOGSファイルを読み込む */
int read_catalogEP( char *path )
{
int catalog = 0;
int i;
unsigned char komokuz[ 34 ];
unsigned char komokuh[ 10 ];
unsigned short saizu;
unsigned short dummy;
if( oprateMode > 1 )
{
TSClose( cdfile );
};
InitTable();
catalog = TSOpen( path , 0 );
if( catalog < 0 )
{
return( -1 );
};
DOSREAD( catalog , &saizu , sizeof( unsigned short ) );
DOSSEEK( catalog , 14 , SEEK_CUR );
i = 0;
while( i < saizu )
{
DOSREAD( catalog , &dummy , sizeof( unsigned short ) );
DOSREAD( catalog , komokuz , 30 ); /* 全角(文献の名前) */
komokuz[ 30 ] = 0;
komokuz[ 31 ] = 0; /* printjis() では2バイト単位で処理するので 0 も2バイト分書き込まないといけない */
DOSSEEK( catalog , 48 , SEEK_CUR );
DOSREAD( catalog , &dummy , sizeof( unsigned short ) );
DOSREAD( catalog , komokuh, 8 ); /* 半角(ディレクトリ名) */
komokuh[ 8 ] = 0;
DOSSEEK( catalog , 74 , SEEK_CUR );
if( e_key == 0 )
{
convJis( (jischar *)komokuz ); /* SJISに変換する */
};
AddTable2( komokuz , komokuh ); /* 後ろの引数2つはダミー(0 , 0のこと) */
i++;
};
TSClose( catalog );
return( 0 );
}
/* CATALOGファイル中のパス名の部分を得る */
/*
in path CATALOGファイルのパス
num 番号
out path2 STARTファイルへのパス(最大8文字だけど、10文字分確保すること)
*/
int get_pathEP( char *path , int num , char *path2 )
{
int catalog = 0;
char *work;
catalog = TSOpen( path , 0 );
if( catalog < 0 )
{
return( -1 );
};
DOSSEEK( catalog , 16 , SEEK_CUR );
if( num > 1 )
{
DOSSEEK( catalog , 164*( num-1 ) , SEEK_CUR );
};
DOSSEEK( catalog , 82 , SEEK_CUR );
DOSREAD( catalog , path2 , 8 ); /* 半角(ディレクトリ名) */
path2[ 8 ] = 0;
/* "dir " -> "dir" */
work = path2+7;
while( *work == 0x20 )
{
work--;
};
work++;
*work = 0;
TSClose( catalog );
return( 0 );
}
/* STARTファイルの文献名を得る */
/*
in path STARTファイルのパス
out title STARTファイルの文献名(最大8文字だけど、10文字分確保すること)
*/
int get_titleEP( char *path , char *title )
{
int i;
unsigned short saizu;
int catalog = 0;
char cpath[ 258 ];
char work[ 258 ];
char path2[10];
char *pwork;
int retcode;
retcode = -1;
/* CATALOGファイルのパスを作る */
strncpy( cpath , path , 2 );
cpath[ 2 ] = '\0';
strcat( cpath , "\\catalogs" );
/* パス名を取り出す */
strcpy( work , path+3 );
/* "koujien\data\honmon" -> "koujien" */
pwork = work;
while( *pwork != '\\' )
{
pwork++;
};
*pwork = 0;
catalog = TSOpen( cpath , 0 );
if( catalog < 0 )
{
/* ULError_str( "eb_sx.x:!! ファイルがオープンできません path=\n" ,cpath ); */
return( -1 ); /* CATALOGファイルが見つからなかった */
};
DOSREAD( catalog , &saizu , sizeof( unsigned short ) );
DOSSEEK( catalog , 14 , SEEK_CUR );
i = 0;
while( i < saizu )
{
DOSSEEK( catalog , 2 , SEEK_CUR );
DOSREAD( catalog , title , 30 );
title[ 30 ] = 0;
DOSSEEK( catalog , 48 , SEEK_CUR );
DOSSEEK( catalog , 2 , SEEK_CUR );
DOSREAD( catalog , path2 , 8 ); /* 半角(ディレクトリ名) */
path2[ 8 ] = 0;
/* "dir " -> "dir" */
pwork = path2+7;
while( *pwork == 0x20 )
{
pwork--;
};
pwork++;
*pwork = 0;
if( stricmp( work , path2 ) == 0 )
{
i = saizu; /* ループ終わり */
retcode = 0;
} else {
title[ 0 ] = '\0';
};
DOSSEEK( catalog , 74 , SEEK_CUR );
i++;
};
TSClose( catalog );
return( retcode );
}
void convJis( jischar *komoku )
{
int sjis;
int i;
i = 0;
while( komoku[ i ] != 0 )
{
sjis = JISSFT( komoku[ i ] );
komoku[ i ] = (jischar)sjis;
i++;
};
}
int AddTable2( char *zen , char *han )
{
int count = 0;
char *dz, *dh, *s;
if (tableMax >= MAX_TABLE_POST_NO )
return -1; /* MAX_TABLE_POST_NO 個以上なんてあったら そりゃ郵政省が悪い */
if ((dz = tablePostNo[tableMax] = _ULMALLOC(strlen(zen) + 10)) == NULL) {
QueryError(1, "メモリが足りません\0\0" , (proc_t) EventForQE, &mainWin, &rectQE);
return -1;
}
/* 32以上だと、項目の0文字目を1バイト開けなければならない
* 表Methodの仕様 */
*dz = 0;
dz += (tableMax < 32 ? 0:1);
/* 項目をコピー */
strcpy( dz,zen);
/* strcpy( dh,han); */
tableFilePos[ tableMax ] = NULL;
tableMax++;
return 0;
}
/* end */